#
# ﻿Empresa desarrolladora: Fujitsu Technology Solutions S.A. - http://ts.fujitsu.com Felipe Munoz Castillo - 29/07/2013
#
# Autor: Junta de Andalucía
# Derechos de explotación propiedad de la Junta de Andalucía.
#
# Éste programa es software libre: usted tiene derecho a redistribuirlo y/o modificarlo bajo los términos de la Licencia EUPL European Public License publicada por el organismo IDABC de la Comisión Europea, en su versión 1.0. o posteriores.
#
# Éste programa se distribuye de buena fe, pero SIN NINGUNA GARANTÍA, incluso sin las presuntas garantías implícitas de USABILIDAD o ADECUACIÓN A PROPÓSITO CONCRETO. Para mas información consulte la Licencia EUPL European Public License.
#
# Usted recibe una copia de la Licencia EUPL European Public License junto con este programa, si por algún motivo no le es posible visualizarla, puede consultarla en la siguiente URL: http://ec.europa.eu/idabc/servlets/Docb4f4.pdf?id=31980
#
# You should have received a copy of the EUPL European Public License along with this program. If not, see
# http://ec.europa.eu/idabc/servlets/Docbb6d.pdf?id=31979
#
# Vous devez avoir reçu une copie de la EUPL European Public License avec ce programme. Si non, voir http://ec.europa.eu/idabc/servlets/Doc5a41.pdf?id=31983
#
# Sie erhalten eine Kopie der europäischen EUPL Public License zusammen mit diesem Programm. Wenn nicht, finden Sie da http://ec.europa.eu/idabc/servlets/Doc9dbe.pdf?id=31977
#

require_dependency 'query'

module FilterSearchHooks
  
  def self.included(base)
    base.extend(ClassMethods)
    base.send(:include, InstanceMethods)
    base.class_eval do
      unloadable
      alias_method_chain :available_filters, :hook
      alias_method_chain :available_columns, :hook
      alias_method_chain :statement, :hook
    end
  end
   
  module ClassMethods
  end
  
  module InstanceMethods
    
    def available_filters_with_hook
      filters = available_filters_without_hook
      # Hook.call_hook está devolviendo el mapa de filtros dentro de un array
      new_filters = Redmine::Hook.call_hook(:hgp_available_filters, {:filters => filters, :project => @project})
      if new_filters != nil && new_filters[0] != nil
        filters.merge!(new_filters[0])
      end
      filters
    end
    
    def available_columns_with_hook
      
      columns = available_columns_without_hook
      
      new_columns = Redmine::Hook.call_hook(:hgp_available_columns, {:columns => columns, :project => @project})
      if new_columns != nil && new_columns[0] != nil
        columns = columns + new_columns[0]
      end
      columns
    end
    
    def statement_with_hook
      
      # Sobrescribe el método statemen del modelo Query
      # Si no se está usando este hook, se llama al statement original
      new_statement = Redmine::Hook.call_hook(:hgp_statement, {:query => self})
      if !new_statement.empty?
        if new_statement.kind_of?(Array) 
          return new_statement[0]
        else
          return new_statement
        end
      else
        return statement_without_hook        
      end 
    end
    
    def sql_for_custom_field_public(field, operator, value, custom_field_id)
      sql_for_custom_field(field, operator, value, custom_field_id)
    end
    
    def sql_for_field_public(field, operator, value, db_table, db_field, is_custom_filter=false)
      sql_for_field(field, operator, value, db_table, db_field, is_custom_filter)
    end
    
  end
  
end
